חלק ג' של המדריך ל-Yii, הפריימוורק הכי טוב לעבודה עם PHP.
על מנת להגיע לשיעור הראשון לחצו כאן, לשיעור השני לחצו כאן.
לפני שאדבר על עבודה במסד נתונים עם מודלים, אדבר על שכבות ברינדור.
השכבות הן המבנה של האתר, וכאשר מרנדרים אותן - הרינדור יוצג בתוך התבנית של האתר.
ראו MVC.
זה פשוט מאוד. ה-layouts נמצאים נמצאים בנתיב protected/views/layouts
נכין שכבה, נקרא לה header, ובה נכתוב תבנית של אתר רגיל, מה שאומר שזה הקובץ protected/views/layouts/header.php
<!DOCTYPE html>
<html dir="rtl">
<head>
<title><?php echo $this->pageTitle; ?></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<div align="center">
<?php echo $content; ?>
</div>
</body>
</html>
<html dir="rtl">
<head>
<title><?php echo $this->pageTitle; ?></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<div align="center">
<?php echo $content; ?>
</div>
</body>
</html>
הסבר: $this לוקח מהמשתנים מה-controller, אבל משום מה לא יצרנו משתנה כזה בקונטרול. אבל בכל מקרה, YII יודע להתאים את הכותרת לפי הקונטרולר והפעולה.
כמובן שלא חייבים להשתמש בזה, ניתן לשנות את הכותרת ע"י הפונקציה setPageTitle שיש ל-controller בסיסי.
המשתנה content מדפיס את מה שרינדרנו.
אם נריץ את האתר, נראה שהכותרת לא תשתנה. זה בגלל שעדיין לא הגדרנו layout לקונטרולר, לכן נפתח את הקונטרולר הקודם שהכנו בשם Main.
protected/controllers/MainController.php
<?php
class MainController extends CController
{
public function actionIndex()
{
$this->render( "login" , array("date"=>date("d/m/Y")) );
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
class MainController extends CController
{
public function actionIndex()
{
$this->render( "login" , array("date"=>date("d/m/Y")) );
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
עכשיו רק נגדיר משתנה בשם layout שהוא יהיה השם של ה-layout. במקרה שלנו, השם של ה-layout זה header.
protected/controller/MainController.php
<?php
class MainController extends CController
{
public $layout = 'header';
public function actionIndex()
{
$this->render( "login" , array("date"=>date("d/m/Y")) );
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
class MainController extends CController
{
public $layout = 'header';
public function actionIndex()
{
$this->render( "login" , array("date"=>date("d/m/Y")) );
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
אם נריץ עכשיו את האתר, נראה שזה ריכז את הכל לאמצע ושינה את הכותרת.
חיבור למסד
אחרי שלמדנו על שכבות, אסביר לכם איך לעבוד עם מסד, אני אדבר רק על MySQL.
דבר ראשון נפתח את ה-config שלנו מהמדריך הקודם:
protected/config/config.php
<?php
return array
(
"defaultController" => "main"
);
?>
return array
(
"defaultController" => "main"
);
?>
בשביל להתחבר אל המסד לא צריך לעשות mysql_connect וכו', פשוט נוסיף עוד אלמנט ב-config בשם components, שהוא מערך, ובתוכו ניצור עוד אלמנט בשם db, שהוא גם יהיה מערך.
protected/config/config.php
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
)
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
)
)
);
?>
כאן נגדיר את הפרטים של המסד, והנה אנחנו מחוברים אליו. :)
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=DBNAME",
"username" => "USERNAME",
"password" => "PASSWORD",
"charset" => "utf8"
)
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=DBNAME",
"username" => "USERNAME",
"password" => "PASSWORD",
"charset" => "utf8"
)
)
);
?>
ב-dbname נכניס את השם של המסד, ב-USERNAME את שם המשתמש, ב-password את הסיסמה של המסד, ו-utf8 זה הקידוד.
אם רשמנו את הפרטים נכון, אנחנו נהיה מחוברים למסד.
עכשיו נצטרך לדעת איך לעבוד עם טבלאות והוספה, חיפוש, כמות וכדו', שאת זה אלמד אותכם במדריך הבא. :)
תגובות לכתבה:
כל הכבוד לך, מחכים לעוד מדריכים. :)
מדהים, כל הכבוד.
הייתי מוסיף במילים שלי ש
כאשר אנחנו מפעילים this->render על view כלשהו
הקונטרולר מרנדר את כל מה שיש בתוך ה view
אחרי זה הוא מרנדר את ה layout ומכניס את מה שהוא רינדר ב view בתור המשתנה $content
של ה layout
עכשיו רק נגדיר משתנה בשם layout שהוא יהיה השם של ה-layout. במקרה שלנו, השם של ה-layout זה header.
protected/controller/MainController.php
^^^^ אחרי זה בקוד שהוצג אין שינוי.
טעות שלי רז שחכתי להוסיף :p
אבל אני חושב שהבנת את העניין אני אנסה לערוך
לא ביודק הבנתי איך מוסיפים את ה layout
יש לך טעות!
כתבת "עכשיו רק נגדיר משתנה בשם layout שהוא יהיה השם של ה-layout. במקרה שלנו, השם של ה-layout זה header." אבל לא הוספת כלום בקוד :(
בדרך כלל גם header לא משמש בתור כל ה layout
אצלי ה layout עושה render ל header.php, אחרי זה echo $content ובסוף render footer
כל הכבוד על המדריך D=
אני כל כך שמח שאתה מכין אותם!
תוסיף את השורה $this->layout = "header";
^__^
אני מתחיל להכנס לעניינים בזכותך!!
>>בדרך כלל גם header לא משמש בתור כל ה layout
>>אצלי ה layout עושה render ל header.php, אחרי זה echo $content ובסוף render footer
ואיפה אתה כותב כל דבר? ואיך? אשמח לדוגמה ;)
אתה יכול לראות את כל קוד המקור של האתר
https://github.com/intval/phpguide
אתה תראה שם קובץ layouts/main.php
שעושה render לקבצים אחרים (header, footer, sidebar)
אני שחכתי להוסיף public $layout = "header״; אני אשמח אם אלכס יערוך את זה, למרות שאני חושב שהבנתם. אני פשוט לא יודע איך לערוך הודעות
לפי הקוד שיצא לי לראות באתר, לא אלכס ולא אתה יכולים לערוך את המדריך.
הדרך היחידה זה דרך ה-PMA. אני טועה אלכס? :)
כן, אתה טועה :)
אני מחכה ל-commit שלך :)
או שאני באמת עייף ולא יכול לבדוק את זה כמו שצריך. חח
מתי המדריך הבא?
המדריך הבא בקרוב :) (אני אשתדל אני אדבר על מודלים ואולי גם על טפסים)
וגם על מסד נתונים D:
יוווווווווווואו כמה נוח זה לעבוד עם YII! מחכה להמשך.
אשמח אם תכין מדריך על איך לעבוד עם מסד נתונים וגם על הרשמת משתמשים + ניהול של אדמין (דברים כמו שהאדמין יכול לשנות את השמות של הדפים בתפריט אן את התוכן ב"אודותינו" וכל זה בלי לשנות את הקוד של הדף אלא להתחבר כאדמין למשתמש שלו ושיש לו אפשרות כזאת)
יא מלך.
מסד נתונים זה גם מודלים
תודה רבה! אין עליך. אני הולך להשתמש בזה המון! מחכה בקוצר רוח להמשך המדריך.
<?php echo $content; ?> - משתנה שרירותי ?
מה בקשר לפונקציה setPageTitle ? איך אני מפעיל אותה ואני רוצה שינוי בכותרת?
אפשרי לשלוח ל layout משתנה שיהיה בעצם הכותרת במידה ואני רוצה להשתמש באותה תבנית בכל הדפים?
תודה.
$content הוא משתנה קבוע ש YII משתמשת בו.
אין צורך להעביר שום משתנה בתור title ל layout
פשוט בקונטרולר שלך תפעיל את המטודה setPageTitle
Yii תציב את הערך במקום המתאים בעצמה.
ואיך אני מפעיל את המתודה? זה לא הכי מובן...
בתוך כל action שבא לך
$this->setPageTitle
תנסה
איך אני מתחבר למסד באמצעות PDO ולא MYSQL ?